package a09_JUC;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Vector;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.TimeUnit;

/**
 * @Author quan
 * @Description 演示使用不同方式下的线程安全的集合类
 * @Date 2023/5/22 15:14
 */
public class a07_ThreadSafeList {
    /**
     * 1、多线程环境下的线程不安全的现象
     * @param args
     */
//    public static void main1(String[] args) throws InterruptedException {
//        //1、定义一个普通的集合类
//        List<Integer> list = new ArrayList<>();
//        //2、用10个线程对这个集合进行add操作，并打印集合
//        for (int i = 0; i < 10; i++) {
//            int finalI = i;
//            Thread thread = new Thread(()->{
//                list.add(finalI);
//                System.out.println(list);
//            });
//            thread.start();
//        }
//        TimeUnit.SECONDS.sleep(1);
//        System.out.println("===================");
//        System.out.println(list);
//    }

    /**
     * 2、使用Vector演示
     * @param args
     * @throws InterruptedException
     */
//    public static void main(String[] args) throws InterruptedException {
//        //1、定义一个集合类 Vector
//        List<Integer> list = new Vector<>();
//        //2、用10个线程对这个集合进行add操作，并打印集合
//        for (int i = 0; i < 10; i++) {
//            int finalI = i;
//            Thread thread = new Thread(()->{
//                list.add(finalI);
//                System.out.println(list);
//            });
//            thread.start();
//        }
//        TimeUnit.SECONDS.sleep(1);
//        System.out.println("===================");
//        System.out.println(list);
//    }

    /**
     * 3、通过工具类来创建一个线程安全的集合类
     * @param args
     * @throws InterruptedException
     */
//    public static void main(String[] args) throws InterruptedException {
//        //1、定义一个集合类 Vector
//        List<Object> list = Collections.synchronizedList(new ArrayList<>());
//        //2、用10个线程对这个集合进行add操作，并打印集合
//        for (int i = 0; i < 10; i++) {
//            int finalI = i;
//            Thread thread = new Thread(()->{
//                list.add(finalI);
//                System.out.println(list);
//            });
//            thread.start();
//        }
//        TimeUnit.SECONDS.sleep(1);
//        System.out.println("===================");
//        System.out.println(list);
//    }

    /**
     *
     * @param args
     * @throws InterruptedException
     */
    public static void main(String[] args) throws InterruptedException {
        //1、使用CopyOnWriteArrayList
        CopyOnWriteArrayList<Integer> list = new CopyOnWriteArrayList<>();
        //2、用10个线程对这个集合进行add操作，并打印集合
        for (int i = 0; i < 10; i++) {
            int finalI = i;
            Thread thread = new Thread(()->{
                list.add(finalI);
                System.out.println(list);
            });
            thread.start();
        }
        TimeUnit.SECONDS.sleep(1);
        System.out.println("===================");
        System.out.println(list);
    }
}
